perm filename FUEXP.F4[MUS,LCS]1 blob
sn#054030 filedate 1974-01-08 generic text, type T, neo UTF8
00100 C THIS PROGRAM CREATES FUNCTIONS FOR THE MUSIC PROGRAM USING
00200 C 'SEG' OR 'SYNTH'. UP TO 10 FUNCTIONS CAN BE STORED IN A
00300 C SINGLE FILE. ONCE CREATED, THE FUNCTIONS MAY BE CHANGED
00400 C AND PUT BACK IN THE SAME FILE OR INTO A NEW ONE.
00500 C NO MORE THAN 50 INPUTS FOR ONE FUNCTION!
00600 C TYPE 'C' (= CRUNCH) FOR SPECIAL FEATURE SUBR.
00615 C 'Z' FOR "CHANGE OR FINISH?" WILL JUMP DIRECTLY TO "CRUNCH" MODE.
00700 C WITH S(EE), <CR> WILL REPEAT SEE COMMAND WITHOUT ASKING FOR FILE.
00800 C'SP'(FOR "SEE")PLOTS IT (SA=ALL);'SL' PUTS IT OUT ON THE LPT.
00900 C FOR EXPONENTIALS GET INTO 'SEG'. TYPE 'X', DECAY FAC, N. IF
01000 C N IS NON-ZERO THE FUNCTION WILL NOT! NORMALIZE (IE. NOT GO TO 0).
01100 C AFTER A FILE HAS BEEN READ IN,
01200 C <CR> FOR 'TYPE FILE' WILL HOLD ON TO IT.
01300 C LOAD WITH -- WRIFUN,FUSUB,DFUEXP,SSS
01500 COMMON/S/H,AMP,CON,PH
01600 COMMON/RD/ A(50,4),B(2,10),FN(10),XA(10),AA(4,178,10)
01700 1,LX,JX,JT,IDEL,FNUM,FNUM1,Z,FLNM,FLNM1,KT
01800 COMMON FUNC(512),F2(512),K,I
01900 COMMON/LT/LPTY,JSEE
02000 DIMENSION RF(4)
02200 21 FORMAT(' C=CHANGE, F=FINISH '$)
02300 22 FORMAT(' NEW FUNC, EDIT, CRUNCH, DELETE, RENAME, SEE? '$)
02400 23 FORMAT(' SEG OR SYNTH? '$)
02500 24 FORMAT(' TYPE FUNCTION NAME '$)
02600 25 FORMAT(' TYPE FILE NAME '$)
02700 26 FORMAT(I3,') TYPE AMPL, STEP# '$)
02800 C 'X' HERE WILL MAKE EXPON. FUNC.
02900 28 FORMAT(' 0=NORM,OR H,A,P,K '$)
03000 280 FORMAT(
03100 1' UP TO 10 FUNCTIONS MAY BE STORED IN EACH FILE'/
03200 1' TYPE "B" TO BACKUP AT ANY TIME'//)
03300 30 FORMAT(8F)
03400 31 FORMAT(1XA5,A1,5A5/)
03500 34 FORMAT(A5,'(',A5,');',A5)
03600 35 FORMAT(1XA5,'IN FILE "',A5,'.DAT"'/)
03700 37 FORMAT(8F9.3)
03800 371 FORMAT(I3,') ',4F8.2)
03900 372 FORMAT(I,21F)
04000 38 FORMAT(2(A5,A1),23A2)
04300 40 FORMAT(11(A1,A3))
04400 41 FORMAT(' ADD TO AN EXISTING FILE? '$)
04500 42 FORMAT(' WHICH FUNC? '$)
04600 47 FORMAT(' C=CHNG, I=INSRT, D=DEL -- + LN# & CHNGS '$)
04700 48 FORMAT(' X,N(=DECAY FAC.) FOR XPONTLS')
04800 2281 TYPE 280
04900 281 KZ=0
05000 JSEE=0
05100 LPTY=5
05200 C USED IN RELATIVE VECTOR ROUTINE
05300 Z=0
05400 EY=0
05500 ICUR=0
05600 XP=0
05650 KT=0
05700 FNUM=0
05800 OLD=0
05900 FNUM1=0
06000 TYPE 22
06100 ACCEPT 40,ON,P
06200 1281 IPLOT=0
06300 IF(ON.EQ.'N'.OR.(ON.EQ.' '.AND.ONX.NE.'S'))GO TO 1000
06400 IF(ON.NE.' ')GO TO 100
06500 ON=ONX
06700 C RETURNS FOR MORE "SEE"
06800 GO TO 4281
06900 100 ONX=ON
07000 TYPE 25
07100 OLD=-1
07200 ACCEPT 38,FLNM1
07300 IF(FLNM1.EQ.' ')FLNM1=FLNM
07400 IF(FLNM1.EQ.0)GO TO 100
07500 IF(FLNM.NE.FLNM1)GO TO 2151
07600 OLD=0
07700 4281 TYPE 40,B
07800 GO TO 1402
08000 2151 FLNM=FLNM1
08100 CALL READ1
08800 3402 JX=-1
08900 LX=0
08910 IF(P.EQ.'A')GO TO 402
08955 C "SA" WILL PLOT ALL FUNCS IN FILE
09000 TYPE 40,B
09100 IF(B(1,2).NE.' ')GO TO 1402
09200 FNUM1=B(2,1)
09300 C ONLY ONE FUNC IN FILE.
09400 GO TO 402
09500 1402 TYPE 42
09600 ACCEPT 40,BU
09700 IF(BU.EQ.'B')GO TO 281
09800 REREAD 38,FNUM1
09900 IDEL=0
10000 C LX IS MAIN COUNTER
10100 IF(OLD)GO TO 402
10200 DO 1302 JX=1,10
10300 1302 IF(FNUM1.EQ.FN(JX))GO TO 5402
10400 GO TO 3402
10500 2202 CALL DPYF(-1,FUNC)
10600 C -1 SUPRESSES DISPLAY
10700 IF(P.EQ.'P'.OR.P.EQ.'A'.OR.P.EQ.0)GO TO 70
10800 LPTY=3
10900 JSEE=-1
11000 CALL DPY(FUNC,1)
11100 CALL EXIT
11200 70 CALL PLOTIT(FUNC,XA(JX),P)
11210 IF(P.EQ.'P')GO TO 2281
11220 JX=JX+1
11230 IF(B(2,JX).NE.' '.AND.JX.LE.10)GO TO 2202
11300 CC P=0
11400 GO TO 2281
11500 402 CALL READER
11600 C AT THIS POINT LX=TOTAL FUNCS+1
11620 5402 IF(P.EQ.'A')JX=1
11700 1202 IF(ON.NE.'C'.AND.ON.NE.'S'.AND.ON.NE.'D')GO TO 3281
11800 IF(P.EQ.'P'.OR.P.EQ.'L'.OR.P.EQ.'A')GO TO 2202
11900 CALL DPYF(JX,FUNC)
12000 IF(ON.EQ.'S')GO TO 2281
12100 IF(ON.EQ.'C')GO TO 1201
12200 TYPE 1139
12300 ACCEPT 40,IDEL
12400 IF(IDEL.EQ.'N')GO TO 2281
12500 IDEL=JX
12600 LX=LX-1
12700 C NOW LX=TOTAL # OF FUNCS.
12800 CALL WRIFUN
12900 1139 FORMAT(' DELETE IT? ',$)
13000 3281 X=' '
13100 TYPE 31,XA(JX),X,FN(JX)
13200 JT=4
13300 IF(XA(JX).EQ.'SEG')JT=2
13400 KZ=1
13500 DO 137 K=1,50
13600 KZ=KZ+1
13700 DO 138 L=1,JT
13800 138 A(K,L)=AA(L,K,JX)
13900 137 IF(A(K,1).EQ.999.OR.A(K,2).GE.100)GO TO 4401
14000
14100 4401 Z=-1
14200 IF(A(K,2).LE.100)GO TO 4403
14300 IF(K.GT.1)GO TO 4404
14400 CALL DPYF(JX,FUNC)
14500 IF(ON.EQ.'R')GO TO 3032
14600 TYPE 4405
14700 A(1,2)=520
14950 GO TO 4201
15000 4404 TYPE 4402
15100 4403 IF(JT.EQ.2)EY='EG'
15200 GO TO 1032
15300 4402 FORMAT(' IT WAS SMOOTHED.')
15400 4405 FORMAT(' CANNOT EDIT CRUNCHED FUNCS.'/)
15500 1000 TYPE 23
15600 ACCEPT 40,BU
15700 IF(BU.EQ.'B')GO TO 281
15800 REREAD 40,X,EY
15900 1032 CALL ZERO(FUNC)
16000 C CLEARS THE FUNC.
16100 ISMOO=0
16200 IF(EY.EQ.'EG')GO TO 800
16300 151 EY=0
16400 JT=4
16500 C FOR WRIFUN
16600 15 KT=1
16700 104 IF(Z.EQ.-1.OR.KT.LT.KZ)GO TO 102
16800 IF(Z.EQ.1)GO TO 2032
16900 1041 KZ=0
17000 TYPE 28
17100 ACCEPT 40,BU
17200 IF(BU.EQ.'B')GO TO 509
17300 REREAD 30,(A(KT,K),K=1,4)
17400 C ACCEPT HARM,AMPL,PHASE,KONSTANT(IF K>100, MULTIPLIES WAVE *(K-100))
17500 102 H=A(KT,1)
17600 IF(H.EQ.0.OR.H.EQ.999.)GO TO 2200
17700 C 999 ENDS 'READIN' SYNTHS
17800 IF(Z.GT.0)TYPE 371,KT,(A(KT,K),K=1,4)
17900 AMP=A(KT,2)
18000 PH=A(KT,3)
18100 CON=A(KT,4)
18200 CALL SYN(FUNC)
18300 KT=KT+1
18400 IF(KZ.LE.KT)CALL DPY(FUNC,1)
18500 GO TO 104
18510 2201 IF(JT.NE.2.OR.A(KT-1,2).GT.100)GO TO 1201
18545 CALL STORE(10)
18580 XA(10)='SEG'
18590 CALL DPYF(10,FUNC)
18700 1201 CALL ZFUNC
18800 C THIS WILL BE FOR SPECIAL FEATURE PACKAGE
18810 IF(KT.EQ.512)GO TO 2281
18855 C FOR BACKUP
18860 4201 EY='EG'
18900 KT=2
19000 GO TO 900
19100 2200 CALL NORM(FUNC)
19200 C NORMALIZES THE FUNCTION
19300 201 IF(BU.EQ.'C')GO TO 2032
19400 IF(ON.EQ.'R')GO TO 3032
19500 204 CALL DPY(FUNC,1)
19600 2011 TYPE 21
19700 IF(EY.EQ.'EG')TYPE 271
19800 C CHANGE IT?
19900 ACCEPT 40,BU
20000 IF(BU.EQ.'C')GO TO 210
20300 IF(BU.EQ.'F')GO TO 900
20400 IF(BU.EQ.'S')GO TO 7000
20500 IF(BU.EQ.'Z')GO TO 2201
20510 C TO USE CURRENT FUNC IN CRUNCH
20600 IF(BU.NE.'B')GO TO 2032
20700 IF(EY.EQ.'EG')GO TO 509
20800 GO TO 5091
20900 C NEXT IS FOR CHANGES ('C' OR <CR>)
21300 2032 TYPE 47
21400 ACCEPT 40,K
21500 REREAD 372,L,X,RF
21600 IF(X.NE.0.OR.RF(1).NE.0)GO TO 211
21700 IF(EY.EQ.'EG')GO TO 204
21800 BU=0
21900 GO TO 1041
22000 211 L=X
22100 IF(K.EQ.'I')GO TO 212
22200 IF(K.NE.'D')GO TO 205
22300 C JUMP IF NO DELETE
22400 KT=KT-1
22500 DO 209 K=L,KT
22600 DO 209 J=1,4
22700 209 A(K,J)=A(K+1,J)
22800 GO TO 210
22900 205 X=RF(2)
23000 IF(EY.NE.'EG')GO TO 1207
23100 IF(X.GE.A(L+1,2).AND.L.LT.KT-1)GO TO 2032
23200 GO TO 208
23300 212 IF(RF(2).NE.0)GO TO 213
23400 RF(2)=RF(1)
23500 RF(1)=X
23600 L=KT
23700 213 IF(EY.NE.'EG')GO TO 214
23800 X=RF(2)
23900 DO 215 K=1,KT
24000 Y=A(K,2)
24100 IF(X.GT.Y)GO TO 215
24200 C JUMP IF NOT PAST STEP NUM.
24300 L=K
24400 IF(X.EQ.Y)GO TO 208
24500 C IF STEP=ANOTHER STEP, IT WORKS LIKE 'C'HANGE.
24600 GO TO 214
24700 215 CONTINUE
24800 214 KT=KT+1
24900 DO 206 K=KT,L,-1
25000 DO 206 J=1,4
25100 206 A(K,J)=A(K-1,J)
25200 GO TO 207
25300 C TO TYPE OLD NUMBERS
25400 208 IF(X.LE.A(L-1,2).AND.L.GT.1)GO TO 2032
25500 1207 TYPE 371,L,(A(L,K),K=1,4)
25600 207 DO 202 K=1,4
25700 202 A(L,K)=RF(K)
25800 210 KZ=KT
25900 Z=1
26000 GO TO 1032
26100 271 FORMAT('+S=SMOOTH '$)
26110 C FOR RENAMES
26140 3032 Z=-1
26170 GO TO 901
26200 900 TYPE 41
26300 C ADD TO EXISTING FILE
26400 ISKP=0
26500 ACCEPT 40,Z
26600 9000 IF(Z.EQ.'B')GO TO 204
26650 IF(Z.EQ.' ')GO TO 900
26700 TYPE 25
26800 ACCEPT 38,FLNM
26810 IF(FLNM.EQ.'B')GO TO 204
26900 IF(FLNM.EQ.' ')FLNM=FLNM1
27100 901 JT=4
27200 IF(EY.EQ.'EG')JT=2
27300 CALL WRIFUN
27400 GO TO 900
27500 C COMES BACK IF NO ROOM IN FILE FOR NEW FUNC.
27600
27700 161 DO 261 K=1,512
27800 261 FUNC(K)=EXP((1-K)/STEP)
27900 KT=2
28000 XP=-1
28100 IF(H.NE.0)GO TO 7009
28200 C H≠0 = NO NORMALIZATION OF XPONTL
28300 X=FUNC(512)
28400 DO 361 K=1,512
28500 361 FUNC(K)=FUNC(K)-(K-1)/511.*X
28600 GO TO 7009
28700 800 IF(XP)GO TO 510
28800 X=0
28900 IK=0
29000 JT=2
29100 C JT AND EY SEEM TO PERFORM THE SAME FUNCTIONS??
29200 Y=0
29300 KT=1
29400 504 IF(KT.GE.KZ)GO TO 510
29500 AMP=A(KT,1)
29600 5008 STEP=A(KT,2)
29700 IF(STEP.LE.A(KT-1,2).AND.KT.GT.1)GO TO 509
29800 C SO IT CAN'T GO BACKWARDS
29900 GO TO 5071
30000 611 FORMAT(' NO MORE THAN 50 SEGS'/)
30100 610 TYPE 611
30200 509 KT=KT-1
30300 5091 IF(KT.LT.1)GO TO 281
30400 GO TO 210
30500 510 IF(KT.EQ.1)TYPE 48
30600 TYPE 26,KT
30700 KZ=0
30800 ACCEPT 40,BU
30900 IF(BU.EQ.'B')GO TO 509
31000 61 REREAD 30,AMP,STEP,H
31100 IF(STEP.LT.1)STEP=1
31200 IF(BU.EQ.'X')GO TO 161
31300 C TYPE 'X' FOR EXPON. FUNC. + DECAY FACTOR, +1 = NO NORM.
31400 C WE START WITH STEP 1 (NOT 0)
31500 5071 IF(KT.GT.50)GO TO 610
31600 C TOO MANY SEGS
31700 IF(Z.GT.0)TYPE 371,KT,AMP,STEP
31800 IF(STEP.GT.100)STEP=100
31900 STPS=STEP-X
32000 IF(STPS.LE.0.AND.KT.NE.1)GO TO 504
32100 C SO IT CAN'T BACKUP HERE
32200 IS=STPS
32300 IF(STEP.LE.1.)Y=AMP
32400 DIF=(AMP-Y)/STPS
32500 IJ=STPS*5.12
32600 CC IK=X*5.12
32700 DO 2031 K=1,IJ
32800 2031 FUNC(K+IK)=Y+DIF*K/5.12
32900 C 100 STEPS ARE CONVERTED HERE TO 512
33000 IK=IK+IJ
33100 12 Y=AMP
33200 X=STEP
33300 A(KT,1)=Y
33400 A(KT,2)=X
33500 7001 KT=KT+1
33600 C KT COUNTS SEGMENTS
33700 IF(STEP.LT.100)GO TO 504
33800 GO TO 201
33900
34000
34100 7000 IF(ISMOO)GO TO 201
34200 IF(KT.LE.20)GO TO 7007
34300 TYPE 7008
34400 GO TO 509
34500 7008 FORMAT(' NO MORE THAN 20 SEGS IN CURVES'/)
34600 7007 CALL SSS(A,KT-1,FUNC)
34700 C DRAWS GRID 2
34800 7009 A(KT-1,2)=520
34900 ISMOO=-1
35000 C SO YOU CAN'T COME BACK 2 TIMES
35100 GO TO 201
35200 END